/**
 * 
 */
package algo3c2g15.domain;


import org.w3c.dom.Document;
import org.w3c.dom.Element;

import algo3c2g15.utils.Constantes;
import algo3c2g15.utils.Matematica;

/**
 * @author De La
 *
 */
public class Humano extends Unidad {
	private Integer nivel = 1; //1=civil, 2=soldado normal, 3=soldado plus
	private Double exp;
	private Edificio edificioEnConstruccion;
	
	public void aumentarPorcentajeConstruido() {
		double i;
		switch ( getNivel() ) {
		    case 1: 
		    	i = 100.0/Constantes.CANT_TURNOS_CREAR_CIVIL;
				setPorcentajeConstruido(getPorcentajeConstruido() + i);
		    	break;
		    case 2:
		    	i = 100.0/Constantes.CANT_TURNOS_CREAR_SOLDADO;
				setPorcentajeConstruido(getPorcentajeConstruido() + i);
				if (getPorcentajeConstruido()==99.99)
					setPorcentajeConstruido(100.0);
					
		    	break;
		    case 3:
		    	i = 100.0/Constantes.CANT_TURNOS_CREAR_SOLDADOPLUS;
				setPorcentajeConstruido(getPorcentajeConstruido() + i);
		    	break;
		}
	}
	
	/**
	 * Devuelve true si esta construyendo, false si no lo esta
	 * @return
	 */
	
	public Boolean construyendo() {
		if ( getEdificioEnConstruccion() == null )
			return false;
		else
			return true;
	}

	/**
	 * 
	 *
	 */
	public Humano() {
		super();
		setVida(1.0);
		setAtaque(0);
		setDefensa(1);
		setAcciones(1);
		setAccionesRestantes(getAcciones());
		setNivel(1);
		setExp(0.0);
		setEdificioEnConstruccion(null);
		setCosto(Constantes.COSTO_CIVIL);
	}
	
	public Humano(Element xmlElement) {
		super(xmlElement);
		setEdificioEnConstruccion(null);
		this.setExp(Double.parseDouble(xmlElement.getAttribute("exp")));
		this.setNivel(Integer.parseInt(xmlElement.getAttribute("nivel")));
	}
	
	/**
	 * 
	 * @return
	 */
	public String getTipo(){
		if (nivel == 1)
			return "Civil";
		if (nivel == 2)
			return "Soldado Normal";
		return "Soldado Plus";
	}
	
	

	/**
	 * @return the nivel
	 */
	public Integer getNivel() {
		return nivel;
	}

	/**
	 * @param nivel the nivel to set
	 */
	public void setNivel(Integer nivel) {
		this.nivel = nivel;
	}
	
	/**
	 * Aumenta un nivel a la unidad
	 * pasando de civil a soladado y luego
	 * de soldado a soldado plus
	 */
	public void aumentarNivel(Integer nivel){
		switch (nivel) {
		case 2 :
			//pasa a ser soldado normal
			setVida(10.0);
			setAtaque(1);
			setNivel(2);
			setDefensa(1);
			setExp(0.0);
			break;
		case 3 :
			//pasa a ser soldado plus
			setVida(15.0);
			setAtaque(2);
			setAcciones(2);
			setNivel(3);
			setDefensa(1);
			setExp(0.0);
			break;
		}
		setPorcentajeConstruido(0);
	}
	
	/**
	 * 
	 */
	public void daniar(Double danio) {
		setVida( Matematica.redondiarADosDecimales( getVida()-danioConDefensa(danio) ) );
	}
	
	/**
	 * @return the exp
	 */
	public Double getExp() {
		return exp;
	}

	/**
	 * @param exp the exp to set
	 */
	public void setExp(Double exp) {
		this.exp =  Matematica.redondiarADosDecimales(exp);
	}

	public void aumentarExperiencia(Float exp){
		setExp(getExp()+exp);
		// si tiene q subir atributos...
		if ( getExp() >= 100 ){
			// si es soldado comun...
			if (getNivel() == 2){
				if (getDefensa() < 3)
					setDefensa(getDefensa()+1);
				if (getAtaque() < 5)
					setAtaque(getAtaque()+1);
			}
			// si es soldado plus...
			if (getNivel() == 3){
				if (getDefensa() < 3)
					setDefensa(getDefensa()+1);
				if (getAtaque() < 6)
					setAtaque(getAtaque()+1);
			}
			setExp(getExp()-100);
		}
	}
	
	/**
	 * Devuelve true si es Civil, false si ya es soldado
	 * 
	 */
	
	public boolean esCivil(){
		if (this.nivel == 1)
			return true;
		else
			return false;
	}
	
	/**
	 * Aumenta el porcentaje de construccion de un edificio
	 * @param edificio
	 */
	
	public void construir(Edificio edificio){
		if ((edificio.construido()) == false && (this.esCivil() == true)) {
			setEdificioEnConstruccion(edificio);
			setAccionesRestantes(0);
		}
	}
	
	/**
	 * Pasa el turno en un Civil y deja de construir si ya termino
	 */
	
	public void pasaTiempo() {
		setAccionesRestantes(getAcciones());
		
		//Si tiene q contruir construye
		if ( !(getEdificioEnConstruccion() == null) ) {
			setAccionesRestantes(0);
			getEdificioEnConstruccion().aumentarPorcentajeConstruido();
			if ( getEdificioEnConstruccion().construido() ) {
				setEdificioEnConstruccion( null );
				setAccionesRestantes(getAcciones());
			}
		}
	}
	

	/**
	 * Establece un edificio en construccion
	 * @param edificio
	 */
	
	private void setEdificioEnConstruccion(Edificio edificio) {
		this.edificioEnConstruccion = edificio;
	}

	public Edificio getEdificioEnConstruccion() {
		return edificioEnConstruccion;
	}

	@Override
	public String getNombre() {
		return getTipo();
	}	
	
	public Element getElementXml(Document doc) {

		Element elemHumano = super.getElementXml(doc);
		
		elemHumano.setAttribute("nivel", getNivel().toString());
		elemHumano.setAttribute("exp", getExp().toString());
		//if (edificioEnConstruccion != null)
		//	elemHumano.appendChild(edificioEnConstruccion.getElementXml(doc));
		
		return elemHumano;
    }
	
	@Override
	public String toString() {
		String buf = new String();
		if (construido()){
			buf = getNombre() + " - Vida: " + getVida()+ " (" + getAccionesRestantes()+ "/"+ getAcciones()+ ")";
			if (this.esCivil()&&(this.construyendo()))
				buf = buf + " - Construyendo";
			return buf;
		}
			
		else
			return getNombre() + " - Vida: " + getVida()+ " (" + getAccionesRestantes()+ "/"+ getAcciones()+ ")" + " - (" + getPorcentajeConstruido() + "%)" ;
	}

	public void cancelarConstruccion() {
		this.edificioEnConstruccion = null;		
	}
}
